package cn.me.alphamq.nameserver.store;

import cn.me.alphamq.common.entity.SlaveAckEntity;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 复制完成后返回的 ack 事件的管理者
 * <p>
 * 对于主从复制集群来说，需要这个管理者来管理 ack 的数量；然后对于链式复制集群来说，不需要统计 ack 的数量
 *
 * @author f
 */
public class ReplicationAckManager {

    /**
     * 管理从节点的 ack 的 map，key：复制消息的唯一 id，value：复制消息对应的 ack 实体对象
     */
    private final Map<String, SlaveAckEntity> slaveAckMap = new ConcurrentHashMap<>();

    /**
     * 添加一个复制消息和其对应的需要的 ack 数量
     *
     * @param replicationMsgId 复制消息的唯一 id
     * @param slaveAckEntity   复制消息对应的 ack 实体对象
     */
    public void putSlaveAck(String replicationMsgId, SlaveAckEntity slaveAckEntity) {
        slaveAckMap.put(replicationMsgId, slaveAckEntity);
    }

    /**
     * 获取指定复制消息的 ack 实体对象
     *
     * @param replicationMsgId 复制消息的唯一 id
     * @return 复制消息的 ack 实体对象
     */
    public SlaveAckEntity getSlaveAck(String replicationMsgId) {
        return slaveAckMap.get(replicationMsgId);
    }

    /**
     * 根据指定的复制消息 id，删除其对应的 ack 实体对象
     *
     * @param replicationMsgId 复制消息的唯一 id
     */
    public void removeSlaveAck(String replicationMsgId) {
        slaveAckMap.remove(replicationMsgId);
    }
}
